/**
 *  Copyright (C) 2021 FISCO BCOS.
 *  SPDX-License-Identifier: Apache-2.0
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 * @file AuthInitializer.h
 * @author: kyonRay
 * @date 2021-11-24
 */

#pragma once
#include "libinitializer/ProtocolInitializer.h"
#include <bcos-codec/abi/ContractABICodec.h>
#include <bcos-framework/interfaces/dispatcher/SchedulerInterface.h>
#include <bcos-framework/interfaces/executor/PrecompiledTypeDef.h>
#include <bcos-framework/interfaces/ledger/LedgerConfig.h>
#include <bcos-tool/NodeConfig.h>
#include <bcos-utilities/Common.h>

using namespace bcos;
using namespace bcos::tool;
using namespace bcos::initializer;
namespace bcos::initializer
{
// clang-format off
static const char* const committeeBin = "60806040523480156200001157600080fd5b5060405162005e6138038062005e6183398101604081905262000034916200022c565b83838383604051620000469062000103565b6200005594939291906200032f565b604051809103906000f08015801562000072573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b03929092169182179055604051309190620000a39062000111565b6001600160a01b03928316815291166020820152604001604051809103906000f080158015620000d7573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b039290921691909117905550620003d892505050565b611584806200286a83390190565b6120738062003dee83390190565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200016057620001606200011f565b604052919050565b60006001600160401b038211156200018457620001846200011f565b5060051b60200190565b600082601f830112620001a057600080fd5b81516020620001b9620001b38362000168565b62000135565b82815260059290921b84018101918181019086841115620001d957600080fd5b8286015b848110156200020a57805163ffffffff81168114620001fc5760008081fd5b8352918301918301620001dd565b509695505050505050565b805160ff811681146200022757600080fd5b919050565b600080600080608085870312156200024357600080fd5b84516001600160401b03808211156200025b57600080fd5b818701915087601f8301126200027057600080fd5b8151602062000283620001b38362000168565b82815260059290921b8401810191818101908b841115620002a357600080fd5b948201945b83861015620002da5785516001600160a01b0381168114620002ca5760008081fd5b82529482019490820190620002a8565b918a0151919850909350505080821115620002f457600080fd5b5062000303878288016200018e565b935050620003146040860162000215565b9150620003246060860162000215565b905092959194509250565b6080808252855190820181905260009060209060a0840190828901845b82811015620003735781516001600160a01b0316845292840192908401906001016200034c565b5050508381038285015286518082528783019183019060005b81811015620003b057835163ffffffff16835292840192918401916001016200038c565b505060ff871660408601529250620003c6915050565b60ff8316606083015295945050505050565b61248280620003e86000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80637475f00f11610097578063bcfb9b6111610066578063bcfb9b61146101f8578063d978ffba1461020b578063e43581b814610240578063f675fdaa1461026357600080fd5b80637475f00f146101aa5780637a25132d146101bd57806385a6a091146101d05780639e3f4f4e146101e557600080fd5b8063614235f3116100d3578063614235f31461015e57806365012582146101715780636ba4790c146101845780637222b4a81461019757600080fd5b806303f19159146100fa578063185c1587146101205780633234f0e61461014b575b600080fd5b61010d610108366004611d36565b610276565b6040519081526020015b60405180910390f35b600054610133906001600160a01b031681565b6040516001600160a01b039091168152602001610117565b61010d610159366004611d9e565b610419565b61010d61016c366004611dce565b6104db565b61010d61017f366004611eb1565b610679565b61010d610192366004611f04565b61077a565b61010d6101a5366004611f34565b610851565b61010d6101b8366004611f52565b610b36565b61010d6101cb366004611f82565b610d31565b6101e36101de366004611fef565b610e56565b005b61010d6101f3366004612008565b610ee2565b6101e3610206366004612072565b611001565b61022e610219366004611fef565b60009081526002602052604090205460ff1690565b60405160ff9091168152602001610117565b61025361024e3660046120a2565b611909565b6040519015158152602001610117565b600154610133906001600160a01b031681565b600061028133611909565b6102a65760405162461bcd60e51b815260040161029d906120bf565b60405180910390fd5b60648460ff1611156103045760405162461bcd60e51b815260206004820152602160248201527f696e76616c69642072616e6765206f66207061727469636970617465735261746044820152606560f81b606482015260840161029d565b60648360ff1611156103585760405162461bcd60e51b815260206004820152601860248201527f696e76616c69642072616e6765206f662077696e526174650000000000000000604482015260640161029d565b6040805160028082526060808301845292600092919060208301908036833701905050905060608682600081518110610393576103936120ed565b602002602001019060ff16908160ff168152505085826001815181106103bb576103bb6120ed565b60ff9092166020928302919091018201526040805160e081018252600c8152309281019290925281018390526060810182905260006080820181905260a0820185905260c082015261040d818761197e565b98975050505050505050565b600061042433611909565b6104405760405162461bcd60e51b815260040161029d906120bf565b604080516001808252818301909252600091602080830190803683370190505090506060808683600081518110610479576104796120ed565b6001600160a01b039283166020918202929092018101919091526040805160e081018252600b8152928a169183019190915281018390526060810182905263ffffffff8716608082015260a08101849052600160c082015261040d818761197e565b60006104e633611909565b6105025760405162461bcd60e51b815260040161029d906120bf565b8260ff166110056001600160a01b0316631749bea96040518163ffffffff1660e01b8152600401602060405180830381865afa158015610546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056a9190612103565b14156105de5760405162461bcd60e51b815260206004820152603b60248201527f7468652063757272656e74206465706c6f79206175746820747970652069732060448201527f7468652073616d6520617320796f752077616e7420746f207365740000000000606482015260840161029d565b60408051600180825281830190925260609160009190602080830190803683370190505090506060858260008151811061061a5761061a6120ed565b60ff9092166020928302919091018201526040805160e081018252601581526110059281019290925281018390526060810182905260006080820181905260a0820185905260c082015261066e818761197e565b979650505050505050565b600061068433611909565b6106a05760405162461bcd60e51b815260040161029d906120bf565b60018351116106e15760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103737b2329760991b604482015260640161029d565b6040805160018082528183019092526060918291600091816020015b60608152602001906001900390816106fd5790505090508581600081518110610728576107286120ed565b6020908102919091018101919091526040805160e08101825260348152611003928101929092528101839052606081018290526000608082015260a08101849052600160c082015261066e818761197e565b600061078533611909565b6107a15760405162461bcd60e51b815260040161029d906120bf565b6040805160018082528183019092526000916020808301908036833701905050905084816000815181106107d7576107d76120ed565b60200260200101906001600160a01b031690816001600160a01b03168152505060608060006040518060e00160405280601660ff168152602001896001600160a01b03168152602001848152602001838152602001600063ffffffff168152602001858152602001881515815250905061040d818761197e565b600061085c33611909565b6108785760405162461bcd60e51b815260040161029d906120bf565b60008054604080516302f3bff160e51b8152905160609384936001600160a01b031692635e77fe2092600480830193928290030181865afa1580156108c1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108e991908101906121b4565b506000546040805163185c158760e01b815290519296508994506001600160a01b0391821693509084169163185c1587916004808201926020929091908290030181865afa15801561093f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096391906122a1565b6001600160a01b0316146109ce5760405162461bcd60e51b815260206004820152602c60248201527f6e657720766f746520636f6d707574657220636f6d6d6974746565206164647260448201526b0cae6e640dad2e6dac2e8c6d60a31b606482015260840161029d565b6040516353bfcf2f60e01b81526001600160a01b038216906353bfcf2f906109fc9086908690600401612302565b602060405180830381865afa158015610a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3d9190612330565b60ff16600214610a8f5760405162461bcd60e51b815260206004820152601e60248201527f6e657720766f746520636f6d707574657220696d70657266656374696f6e0000604482015260640161029d565b604080516001808252818301909252600091602080830190803683370190505090506060808883600081518110610ac857610ac86120ed565b6001600160a01b039283166020918202929092018101919091526040805160e081018252600d81526001549093169183019190915281018390526060810182905260006080820181905260a0820185905260c0820152610b28818a61197e565b9a9950505050505050505050565b6000610b4133611909565b610b5d5760405162461bcd60e51b815260040161029d906120bf565b6001600160a01b038316610bb35760405162461bcd60e51b815260206004820152601c60248201527f636f6e74726163742061646472657373206e6f74206578697374732e00000000604482015260640161029d565b6040516364efb22b60e01b81526001600160a01b0384166004820152611005906364efb22b90602401602060405180830381865afa158015610bf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1d91906122a1565b6001600160a01b0316846001600160a01b03161415610c9b5760405162461bcd60e51b815260206004820152603460248201527f746865206163636f756e7420686173206265656e207468652061646d696e206f604482015273331031b7b731bab9393a1031b7b73a3930b1ba1760611b606482015260840161029d565b604080516001808252818301909252600091602080830190803683370190505090506060808683600081518110610cd457610cd46120ed565b6001600160a01b039283166020918202929092018101919091526040805160e081018252601f81529289169183019190915281018390526060810182905260006080820181905260a0820185905260c082015261040d818761197e565b6000610d3c33611909565b610d585760405162461bcd60e51b815260040161029d906120bf565b6001845111610d9f5760405162461bcd60e51b815260206004820152601360248201527234b73b30b634b21035b2bc903632b733ba341760691b604482015260640161029d565b60408051600280825260608281019093528291600091816020015b6060815260200190600190039081610dba5790505090508681600081518110610de557610de56120ed565b60200260200101819052508581600181518110610e0457610e046120ed565b6020908102919091018101919091526040805160e081018252602981526110009281019290925281018390526060810182905260006080820181905260a0820185905260c082015261040d818761197e565b610e5f33611909565b610e7b5760405162461bcd60e51b815260040161029d906120bf565b600154604051631068aa6d60e11b8152600481018390523360248201526001600160a01b03909116906320d154da90604401600060405180830381600087803b158015610ec757600080fd5b505af1158015610edb573d6000803e3d6000fd5b5050505050565b6000610eed33611909565b610f095760405162461bcd60e51b815260040161029d906120bf565b6001855111610f4a5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103737b2329760991b604482015260640161029d565b6040805160018082528183019092526060918291600091816020015b6060815260200190600190039081610f665790505090508781600081518110610f9157610f916120ed565b602002602001018190525060006040518060e00160405280603360ff1681526020016110036001600160a01b031681526020018481526020018381526020018963ffffffff1681526020018581526020018815158152509050610ff4818761197e565b9998505050505050505050565b61100a33611909565b6110265760405162461bcd60e51b815260040161029d906120bf565b6001546040516318ae72f160e11b81526004810184905282151560248201523360448201526000916001600160a01b03169063315ce5e2906064016020604051808303816000875af1158015611080573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a49190612330565b90506110fa6040518060e00160405280600060ff16815260200160006001600160a01b031681526020016060815260200160608152602001600063ffffffff168152602001606081526020016000151581525090565b8160ff16600214156119035760008481526002602090815260408083208054825160e08101845260ff82168082526101009092046001600160a01b031681860152600183018054855181880281018801875281815293969295860193928301828280156111a457602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116111755790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b8282101561127e5783829060005260206000200180546111f19061234d565b80601f016020809104026020016040519081016040528092919081815260200182805461121d9061234d565b801561126a5780601f1061123f5761010080835404028352916020019161126a565b820191906000526020600020905b81548152906001019060200180831161124d57829003601f168201915b5050505050815260200190600101906111d2565b50505090825250600382015463ffffffff1660208083019190915260048301805460408051828502810185018252828152940193928301828280156112ec57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116112ce575b50505091835250506005919091015460ff90811615156020909201919091529093508116600b141561144b57608083015163ffffffff166113a757336001600160a01b03168360a00151600081518110611348576113486120ed565b60200260200101516001600160a01b031614156113a75760405162461bcd60e51b815260206004820152601c60248201527f596f752063616e206e6f742072656d6f766520796f757273656c662100000000604482015260640161029d565b6000805460a085015180516001600160a01b039092169263f437695a926113d0576113d06120ed565b602002602001015185608001516040518363ffffffff1660e01b81526004016114149291906001600160a01b0392909216825263ffffffff16602082015260400190565b600060405180830381600087803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b505050506118cd565b8060ff16600c14156114d35760008054604085015180516001600160a01b03909216926399bc9c1b92611480576114806120ed565b6020026020010151856040015160018151811061149f5761149f6120ed565b60200260200101516040518363ffffffff1660e01b815260040161141492919060ff92831681529116602082015260400190565b8060ff16600d141561153e5760015460a084015180516001600160a01b039092169163290bc797919060009061150b5761150b6120ed565b60200260200101516040518263ffffffff1660e01b815260040161141491906001600160a01b0391909116815260200190565b8060ff16601514156115e9576110056001600160a01b031663bb0aa40c8460400151600081518110611572576115726120ed565b60200260200101516040518263ffffffff1660e01b815260040161159f919060ff91909116815260200190565b6020604051808303816000875af11580156115be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e29190612103565b91506118cd565b8060ff1660161415611682578260c001511561165a576110056001600160a01b031663615480998460a00151600081518110611627576116276120ed565b60200260200101516040518263ffffffff1660e01b815260040161159f91906001600160a01b0391909116815260200190565b6110056001600160a01b03166356bd70848460a00151600081518110611627576116276120ed565b8060ff16601f14156116f5576110056001600160a01b031663c53057b484602001518560a001516000815181106116bb576116bb6120ed565b60200260200101516040518363ffffffff1660e01b815260040161159f9291906001600160a01b0392831681529116602082015260400190565b8060ff166029141561176d576110006001600160a01b031663bd291aef8460600151600081518110611729576117296120ed565b60200260200101518560600151600181518110611748576117486120ed565b60200260200101516040518363ffffffff1660e01b815260040161159f9291906123d5565b8060ff166033141561185e578260c001511561183657608083015163ffffffff166117de576110036001600160a01b0316632800efc084606001516000815181106117ba576117ba6120ed565b60200260200101516040518263ffffffff1660e01b815260040161159f91906123fa565b6110036001600160a01b031663359168568460600151600081518110611806576118066120ed565b6020026020010151856080015163ffffffff166040518363ffffffff1660e01b815260040161159f92919061240d565b6110036001600160a01b031663ce6fa5c58460600151600081518110611806576118066120ed565b8060ff1660341415611892576110036001600160a01b03166380599e4b84606001516000815181106117ba576117ba6120ed565b60405162461bcd60e51b815260206004820152601060248201526f3b37ba32903a3cb8329032b93937b91760811b604482015260640161029d565b6040518281527f7251e13f6f51fdfe60094817f80310366d2e1148fe8a46cb475b582d35bfdea89060200160405180910390a150505b50505050565b60008054604051631c86b03760e31b81526001600160a01b0384811660048301529091169063e43581b890602401602060405180830381865afa158015611954573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611978919061242f565b92915050565b6001548251602084015160405163161cab7f60e11b815233600482015260ff90921660248301526001600160a01b039081166044830152606482018490526000928392911690632c3956fe906084016020604051808303816000875af11580156119ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a109190612103565b60008181526002602090815260409182902087518154838a01516001600160a01b0316610100026001600160a81b031990911660ff909216919091171781559187015180519394508793611a6a9260018501920190611af0565b5060608201518051611a86916002840191602090910190611b96565b50608082015160038201805463ffffffff191663ffffffff90921691909117905560a08201518051611ac2916004840191602090910190611bef565b5060c091909101516005909101805460ff1916911515919091179055611ae9816001611001565b9392505050565b82805482825590600052602060002090601f01602090048101928215611b865791602002820160005b83821115611b5757835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302611b19565b8015611b845782816101000a81549060ff0219169055600101602081600001049283019260010302611b57565b505b50611b92929150611c44565b5090565b828054828255906000526020600020908101928215611be3579160200282015b82811115611be35782518051611bd3918491602090910190611c59565b5091602001919060010190611bb6565b50611b92929150611ccd565b828054828255906000526020600020908101928215611b86579160200282015b82811115611b8657825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611c0f565b5b80821115611b925760008155600101611c45565b828054611c659061234d565b90600052602060002090601f016020900481019282611c875760008555611b86565b82601f10611ca057805160ff1916838001178555611b86565b82800160010185558215611b86579182015b82811115611b86578251825591602001919060010190611cb2565b80821115611b92576000611ce18282611cea565b50600101611ccd565b508054611cf69061234d565b6000825580601f10611d06575050565b601f016020900490600052602060002090810190611d249190611c44565b50565b60ff81168114611d2457600080fd5b600080600060608486031215611d4b57600080fd5b8335611d5681611d27565b92506020840135611d6681611d27565b929592945050506040919091013590565b6001600160a01b0381168114611d2457600080fd5b63ffffffff81168114611d2457600080fd5b600080600060608486031215611db357600080fd5b8335611dbe81611d77565b92506020840135611d6681611d8c565b60008060408385031215611de157600080fd5b8235611dec81611d27565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611e3957611e39611dfa565b604052919050565b600082601f830112611e5257600080fd5b813567ffffffffffffffff811115611e6c57611e6c611dfa565b611e7f601f8201601f1916602001611e10565b818152846020838601011115611e9457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215611ec457600080fd5b823567ffffffffffffffff811115611edb57600080fd5b611ee785828601611e41565b95602094909401359450505050565b8015158114611d2457600080fd5b600080600060608486031215611f1957600080fd5b8335611f2481611d77565b92506020840135611d6681611ef6565b60008060408385031215611f4757600080fd5b8235611dec81611d77565b600080600060608486031215611f6757600080fd5b8335611f7281611d77565b92506020840135611d6681611d77565b600080600060608486031215611f9757600080fd5b833567ffffffffffffffff80821115611faf57600080fd5b611fbb87838801611e41565b94506020860135915080821115611fd157600080fd5b50611fde86828701611e41565b925050604084013590509250925092565b60006020828403121561200157600080fd5b5035919050565b6000806000806080858703121561201e57600080fd5b843567ffffffffffffffff81111561203557600080fd5b61204187828801611e41565b945050602085013561205281611d8c565b9250604085013561206281611ef6565b9396929550929360600135925050565b6000806040838503121561208557600080fd5b82359150602083013561209781611ef6565b809150509250929050565b6000602082840312156120b457600080fd5b8135611ae981611d77565b6020808252601490820152733cb7ba9036bab9ba1031329033b7bb32b93737b960611b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561211557600080fd5b5051919050565b600067ffffffffffffffff82111561213657612136611dfa565b5060051b60200190565b600082601f83011261215157600080fd5b815160206121666121618361211c565b611e10565b82815260059290921b8401810191818101908684111561218557600080fd5b8286015b848110156121a957805161219c81611d8c565b8352918301918301612189565b509695505050505050565b600080600080608085870312156121ca57600080fd5b84516121d581611d27565b809450506020808601516121e881611d27565b604087015190945067ffffffffffffffff8082111561220657600080fd5b818801915088601f83011261221a57600080fd5b81516122286121618261211c565b81815260059190911b8301840190848101908b83111561224757600080fd5b938501935b8285101561226e57845161225f81611d77565b8252938501939085019061224c565b60608b0151909750945050508083111561228757600080fd5b505061229587828801612140565b91505092959194509250565b6000602082840312156122b357600080fd5b8151611ae981611d77565b600081518084526020808501945080840160005b838110156122f75781516001600160a01b0316875295820195908201906001016122d2565b509495945050505050565b60408152600061231560408301856122be565b828103602084015261232781856122be565b95945050505050565b60006020828403121561234257600080fd5b8151611ae981611d27565b600181811c9082168061236157607f821691505b6020821081141561238257634e487b7160e01b600052602260045260246000fd5b50919050565b6000815180845260005b818110156123ae57602081850181015186830182015201612392565b818111156123c0576000602083870101525b50601f01601f19169290920160200192915050565b6040815260006123e86040830185612388565b82810360208401526123278185612388565b602081526000611ae96020830184612388565b6040815260006124206040830185612388565b90508260208301529392505050565b60006020828403121561244157600080fd5b8151611ae981611ef656fea2646970667358221220e85439387687fb40a454c2907e0cc9f5672a2730662480ebb006640171ea0d1464736f6c634300080b003360806040523480156200001157600080fd5b506040516200158438038062001584833981016040819052620000349162000724565b600080546001600160a01b031916331781555b84518163ffffffff161015620000c257620000ad858263ffffffff168151811062000076576200007662000827565b6020026020010151858363ffffffff168151811062000099576200009962000827565b6020026020010151620000fb60201b60201c565b80620000b98162000853565b91505062000047565b506004805461ffff191661010060ff8481169190910260ff191691909117908416179055620000f13362000287565b50505050620008c5565b6200010633620002f0565b620001465760405162461bcd60e51b815260206004820152600b60248201526a4f6e6c79206f776e65722160a81b60448201526064015b60405180910390fd5b63ffffffff8116620001f0576001600160a01b038216321415620001ad5760405162461bcd60e51b815260206004820152601c60248201527f596f752063616e206e6f742072656d6f766520796f757273656c66210000000060448201526064016200013d565b6001600160a01b0382166000908152600360209081526040909120805463ffffffff19169055620001ec906001908490620005c462000338821b17901c565b5050565b6200020b826001620004d660201b620007421790919060201c565b1562000240576001600160a01b0382166000908152600360205260409020805463ffffffff191663ffffffff83161790555050565b6001600160a01b0382166000908152600360209081526040909120805463ffffffff191663ffffffff8416179055620001ec906001908490620004f4811b6200076017901c565b6200029233620002f0565b620002ce5760405162461bcd60e51b815260206004820152600b60248201526a4f6e6c79206f776e65722160a81b60448201526064016200013d565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382163014156200030c57506001919050565b6000546001600160a01b03838116911614156200032b57506001919050565b506000919050565b919050565b6001600160a01b038116600090815260208390526040902054620003ab5760405162461bcd60e51b815260206004820152602360248201527f4c6962416464726573735365743a2076616c756520646f65736e27742065786960448201526239ba1760e91b60648201526084016200013d565b6001600160a01b038116600090815260208390526040812054620003d2906001906200087a565b600184810154919250600091620003ea91906200087a565b9050600084600101828154811062000406576200040662000827565b6000918252602090912001546001860180546001600160a01b0390921692508291859081106200043a576200043a62000827565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790556200047083600162000894565b6001600160a01b038083166000908152602088905260408082209390935590861681529081205560018501805480620004ad57620004ad620008af565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6001600160a01b031660009081526020919091526040902054151590565b6001600160a01b038116620005565760405162461bcd60e51b815260206004820152602160248201527f4c6962416464726573735365743a2076616c75652063616e27742062652030786044820152600360fc1b60648201526084016200013d565b6001600160a01b03811660009081526020839052604090205415620005d65760405162461bcd60e51b815260206004820152602f60248201527f4c6962416464726573735365743a2076616c756520616c72656164792065786960448201526e39ba399034b7103a34329039b2ba1760891b60648201526084016200013d565b6001808301805491820181556000818152602080822090930180546001600160a01b039095166001600160a01b0319909516851790559054928152929052604090912055565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200065d576200065d6200061c565b604052919050565b60006001600160401b038211156200068157620006816200061c565b5060051b60200190565b600082601f8301126200069d57600080fd5b81516020620006b6620006b08362000665565b62000632565b82815260059290921b84018101918181019086841115620006d657600080fd5b8286015b848110156200070757805163ffffffff81168114620006f95760008081fd5b8352918301918301620006da565b509695505050505050565b805160ff811681146200033357600080fd5b600080600080608085870312156200073b57600080fd5b84516001600160401b03808211156200075357600080fd5b818701915087601f8301126200076857600080fd5b815160206200077b620006b08362000665565b82815260059290921b8401810191818101908b8411156200079b57600080fd5b948201945b83861015620007d25785516001600160a01b0381168114620007c25760008081fd5b82529482019490820190620007a0565b918a0151919850909350505080821115620007ec57600080fd5b50620007fb878288016200068b565b9350506200080c6040860162000712565b91506200081c6060860162000712565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818114156200087057620008706200083d565b6001019392505050565b6000828210156200088f576200088f6200083d565b500390565b60008219821115620008aa57620008aa6200083d565b500190565b634e487b7160e01b600052603160045260246000fd5b610caf80620008d56000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063ac6c525111610071578063ac6c52511461014d578063b2bdfa7b1461017c578063b6fd9067146101a7578063cd5d2118146101b9578063e43581b8146101dc578063f437695a146101ef57600080fd5b806313af4035146100b957806322acb867146100ce5780635615696f146100f05780635e77fe201461010f578063965b9ff11461012757806399bc9c1b1461013a575b600080fd5b6100cc6100c7366004610959565b610202565b005b6100d6610252565b60405163ffffffff90911681526020015b60405180910390f35b6004546100fd9060ff1681565b60405160ff90911681526020016100e7565b610117610266565b6040516100e7949392919061097b565b6100d6610135366004610a33565b61036b565b6100cc610148366004610b09565b6103ea565b6100d661015b366004610959565b6001600160a01b031660009081526003602052604090205463ffffffff1690565b60005461018f906001600160a01b031681565b6040516001600160a01b0390911681526020016100e7565b6004546100fd90610100900460ff1681565b6101cc6101c7366004610959565b610432565b60405190151581526020016100e7565b6101cc6101ea366004610959565b610478565b6100cc6101fd366004610b3c565b61048b565b61020b33610432565b6102305760405162461bcd60e51b815260040161022790610b7c565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006102616101356001610875565b905090565b6000806060806102766001610875565b9150815167ffffffffffffffff81111561029257610292610a1d565b6040519080825280602002602001820160405280156102bb578160200160208202803683370190505b50905060005b825181101561035257600360008483815181106102e0576102e0610ba1565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a900463ffffffff1682828151811061032b5761032b610ba1565b63ffffffff909216602092830291909101909101528061034a81610bcd565b9150506102c1565b5060045460ff8082169661010090920416945091925090565b600080805b83518163ffffffff1610156103e35760036000858363ffffffff168151811061039b5761039b610ba1565b6020908102919091018101516001600160a01b03168252810191909152604001600020546103cf9063ffffffff1683610be8565b9150806103db81610c10565b915050610370565b5092915050565b6103f333610432565b61040f5760405162461bcd60e51b815260040161022790610b7c565b6004805461ffff191661010060ff9384160260ff19161792909116919091179055565b60006001600160a01b03821630141561044d57506001919050565b6000546001600160a01b038381169116141561046b57506001919050565b506000919050565b919050565b6000610485600183610742565b92915050565b61049433610432565b6104b05760405162461bcd60e51b815260040161022790610b7c565b63ffffffff8116610546576001600160a01b0382163214156105145760405162461bcd60e51b815260206004820152601c60248201527f596f752063616e206e6f742072656d6f766520796f757273656c6621000000006044820152606401610227565b6001600160a01b0382166000908152600360205260409020805463ffffffff191690556105426001836105c4565b5050565b610551600183610742565b15610585576001600160a01b0382166000908152600360205260409020805463ffffffff191663ffffffff83161790555050565b6001600160a01b0382166000908152600360205260409020805463ffffffff191663ffffffff8381169190911790915561054290600190849061076016565b6105ce8282610742565b6106265760405162461bcd60e51b815260206004820152602360248201527f4c6962416464726573735365743a2076616c756520646f65736e27742065786960448201526239ba1760e91b6064820152608401610227565b6001600160a01b03811660009081526020839052604081205461064b90600190610c34565b6001848101549192506000916106619190610c34565b9050600084600101828154811061067a5761067a610ba1565b6000918252602090912001546001860180546001600160a01b0390921692508291859081106106ab576106ab610ba1565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790556106df836001610c4b565b6001600160a01b03808316600090815260208890526040808220939093559086168152908120556001850180548061071957610719610c63565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6001600160a01b031660009081526020919091526040902054151590565b6001600160a01b0381166107c05760405162461bcd60e51b815260206004820152602160248201527f4c6962416464726573735365743a2076616c75652063616e27742062652030786044820152600360fc1b6064820152608401610227565b6107ca8282610742565b1561082f5760405162461bcd60e51b815260206004820152602f60248201527f4c6962416464726573735365743a2076616c756520616c72656164792065786960448201526e39ba399034b7103a34329039b2ba1760891b6064820152608401610227565b6001808301805491820181556000818152602080822090930180546001600160a01b039095166001600160a01b0319909516851790559054928152929052604090912055565b600181015460609060009067ffffffffffffffff81111561089857610898610a1d565b6040519080825280602002602001820160405280156108c1578160200160208202803683370190505b50905060005b60018401548110156103e3578360010181815481106108e8576108e8610ba1565b9060005260206000200160009054906101000a90046001600160a01b031682828151811061091857610918610ba1565b6001600160a01b03909216602092830291909101909101528061093a81610bcd565b9150506108c7565b80356001600160a01b038116811461047357600080fd5b60006020828403121561096b57600080fd5b61097482610942565b9392505050565b60006080820160ff87168352602060ff8716818501526080604085015281865180845260a086019150828801935060005b818110156109d15784516001600160a01b0316835293830193918301916001016109ac565b50508481036060860152855180825290820192508186019060005b81811015610a0e57825163ffffffff16855293830193918301916001016109ec565b50929998505050505050505050565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215610a4657600080fd5b823567ffffffffffffffff80821115610a5e57600080fd5b818501915085601f830112610a7257600080fd5b813581811115610a8457610a84610a1d565b8060051b604051601f19603f83011681018181108582111715610aa957610aa9610a1d565b604052918252848201925083810185019188831115610ac757600080fd5b938501935b82851015610aec57610add85610942565b84529385019392850192610acc565b98975050505050505050565b803560ff8116811461047357600080fd5b60008060408385031215610b1c57600080fd5b610b2583610af8565b9150610b3360208401610af8565b90509250929050565b60008060408385031215610b4f57600080fd5b610b5883610942565b9150602083013563ffffffff81168114610b7157600080fd5b809150509250929050565b6020808252600b908201526a4f6e6c79206f776e65722160a81b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415610be157610be1610bb7565b5060010190565b600063ffffffff808316818516808303821115610c0757610c07610bb7565b01949350505050565b600063ffffffff80831681811415610c2a57610c2a610bb7565b6001019392505050565b600082821015610c4657610c46610bb7565b500390565b60008219821115610c5e57610c5e610bb7565b500190565b634e487b7160e01b600052603160045260246000fdfea264697066735822122085fafc65a9ded246b2c31779d206cec20aefb591774f8d42cc273420eb860a2664736f6c634300080b003360806040523480156200001157600080fd5b5060405162002073380380620020738339810160408190526200003491620000e1565b600080546001600160a01b03191633179055604051829082906200005890620000b6565b6001600160a01b03928316815291166020820152604001604051809103906000f0801580156200008c573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b039290921691909117905550620001199050565b610a2b806200164883390190565b80516001600160a01b0381168114620000dc57600080fd5b919050565b60008060408385031215620000f557600080fd5b6200010083620000c4565b91506200011060208401620000c4565b90509250929050565b61151f80620001296000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063401853b711610097578063bc903cb811610066578063bc903cb8146102c3578063cd5d2118146102e9578063dde248e31461030c578063fcf81c141461032c57600080fd5b8063401853b7146102555780636d23cd581461027c5780636f2904cc1461028f578063b2bdfa7b1461029857600080fd5b806320d154da116100d357806320d154da14610209578063290bc7971461021c5780632c3956fe1461022f578063315ce5e21461024257600080fd5b80630a4948401461010557806313af40351461019657806319dcd07e146101ab5780631cc05cbc146101d0575b600080fd5b6101586101133660046110c1565b600360208190526000918252604090912080546001820154600283015492909301546001600160a01b03918216939182169260ff600160a01b90930483169290911685565b604080516001600160a01b03968716815295909416602086015260ff92831693850193909352606084015216608082015260a0015b60405180910390f35b6101a96101a43660046110f1565b61033f565b005b6101be6101b93660046110c1565b61038f565b60405160ff909116815260200161018d565b6101fb6101de366004611125565b600460209081526000928352604080842090915290825290205481565b60405190815260200161018d565b6101a961021736600461115a565b61043b565b6101a961022a3660046110f1565b61054d565b6101fb61023d36600461117d565b610594565b6101be6102503660046111ca565b6107d6565b6101be6102633660046110c1565b6000908152600360208190526040909120015460ff1690565b6101fb61028a366004611125565b610b26565b6101fb60025481565b6000546102ab906001600160a01b031681565b6040516001600160a01b03909116815260200161018d565b6102d66102d13660046110c1565b610b54565b60405161018d9796959493929190611251565b6102fc6102f73660046110f1565b610c62565b604051901515815260200161018d565b61031f61031a3660046112b5565b610ca8565b60405161018d91906112d7565b6001546102ab906001600160a01b031681565b61034833610c62565b61036d5760405162461bcd60e51b8152600401610364906113af565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260036020819052604082200154829060ff166103e75760405162461bcd60e51b8152602060048201526012602482015271141c9bdc1bdcd85b081b9bdd08195e1a5cdd60721b6044820152606401610364565b60008381526003602081905260409091209081015460ff166001141561042b57806002015443111561042b57600301805460ff191660059081179091559150610435565b6003015460ff1691505b50919050565b61044433610c62565b6104605760405162461bcd60e51b8152600401610364906113af565b60008281526003602052604090206104778361038f565b60ff166001146104dc5760405162461bcd60e51b815260206004820152602a60248201527f4f6e6c79206e65776c7920637265617465642070726f706f73616c2063616e206044820152691899481c995d9bdad95960b21b6064820152608401610364565b60018101546001600160a01b0383811691161461053b5760405162461bcd60e51b815260206004820152601860248201527f4f6e6c792070726f706f7365722063616e207265766f6b6500000000000000006044820152606401610364565b600301805460ff191660041790555050565b61055633610c62565b6105725760405162461bcd60e51b8152600401610364906113af565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600061059f33610c62565b6105bb5760405162461bcd60e51b8152600401610364906113af565b60ff80851660009081526004602090815260408083206001600160a01b03881684528252808320548084526003928390529220015490911660011415610606576106048161038f565b505b6000818152600360208190526040909120015460ff166001141561066c5760405162461bcd60e51b815260206004820152601860248201527f43757272656e742070726f706f73616c206e6f7420656e6400000000000000006044820152606401610364565b6002805490600061067c836113ea565b91905055506000600254905060608060006040518060e00160405280896001600160a01b031681526020018b6001600160a01b031681526020018a60ff16815260200188436106cb9190611405565b815260016020808301829052604080840188905260609384018790526000898152600380845290829020865181546001600160a01b0319166001600160a01b0391821617825587850151958201805494890151969091166001600160a81b031990941693909317600160a01b60ff96871602179092559385015160028201556080850151938101805460ff1916949093169390931790915560a08301518051939450849361077f9260048501920190611047565b5060c0820151805161079b916005840191602090910190611047565b50505060ff891660009081526004602090815260408083206001600160a01b038c168452909152902084905550919350505050949350505050565b60006107e133610c62565b6107fd5760405162461bcd60e51b8152600401610364906113af565b60008481526003602081905260409091200154849060ff166108565760405162461bcd60e51b8152602060048201526012602482015271141c9bdc1bdcd85b081b9bdd08195e1a5cdd60721b6044820152606401610364565b60008581526003602081905260409091200154859060ff166001146108bd5760405162461bcd60e51b815260206004820152601760248201527f50726f706f73616c206973206e6f7420766f7461626c650000000000000000006044820152606401610364565b600086815260036020818152604092839020835160e08101855281546001600160a01b03908116825260018301549081168285015260ff600160a01b9091048116828701526002830154606083015293820154909316608084015260048101805485518185028101850190965280865291946109e69493869360a08601939183018282801561097557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610957575b50505050508152602001600582018054806020026020016040519081016040528092919081815260200182805480156109d757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109b9575b50505050508152505086610fa7565b15610a235760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481d9bdd1959609a1b6044820152606401610364565b8515610a5e57600481018054600181018255600091825260209091200180546001600160a01b0319166001600160a01b038716179055610a8f565b600581018054600181018255600091825260209091200180546001600160a01b0319166001600160a01b0387161790555b6001546040516353bfcf2f60e01b81526000916001600160a01b0316906353bfcf2f90610ac79060048087019160058801910161145b565b602060405180830381865afa158015610ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b089190611489565b600392909201805460ff191660ff8416179055509695505050505050565b60ff821660009081526004602090815260408083206001600160a01b03851684529091529020545b92915050565b600081815260036020818152604092839020805460018201546002830154948301546004840180548851818802810188019099528089526001600160a01b039485169894841697600160a01b90940460ff908116979496931694606094859493919290830182828015610bf057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610bd2575b5050505050925080600501805480602002602001604051908101604052809291908181526020018280548015610c4f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c31575b5050505050915050919395979092949650565b60006001600160a01b038216301415610c7d57506001919050565b6000546001600160a01b0383811691161415610c9b57506001919050565b506000919050565b919050565b6060600254831115610d0b5760405162461bcd60e51b815260206004820152602660248201527f2766726f6d272069732067726561746572207468616e202770726f706f73616c604482015265436f756e742760d01b6064820152608401610364565b81831115610d5b5760405162461bcd60e51b815260206004820152601b60248201527f2766726f6d272069732067726561746572207468616e2027746f2700000000006044820152606401610364565b600254821115610d6b5760025491505b6001831015610d7957600192505b6000610d8584846114a6565b610d90906001611405565b67ffffffffffffffff811115610da857610da86114bd565b604051908082528060200260200182016040528015610e3157816020015b610e1e6040518060e0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600060ff16815260200160008152602001600060ff16815260200160608152602001606081525090565b815260200190600190039081610dc65790505b5090506000845b848111610f9d57600081815260036020818152604092839020835160e08101855281546001600160a01b03908116825260018301549081168285015260ff600160a01b909104811682870152600283015460608301529382015490931660808401526004810180548551818502810185019096528086529194859360a086019391929190830182828015610ef557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ed7575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015610f5757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f39575b505050505081525050848480610f6c906113ea565b955081518110610f7e57610f7e6114d3565b6020026020010181905250508080610f95906113ea565b915050610e38565b5090949350505050565b6000610fb78360a0015183610fe1565b80610fcb5750610fcb8360c0015183610fe1565b15610fd857506001610b4e565b50600092915050565b6000805b835181101561103d57838181518110611000576110006114d3565b60200260200101516001600160a01b0316836001600160a01b0316141561102b576001915050610b4e565b80611035816113ea565b915050610fe5565b5060009392505050565b82805482825590600052602060002090810192821561109c579160200282015b8281111561109c57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611067565b506110a89291506110ac565b5090565b5b808211156110a857600081556001016110ad565b6000602082840312156110d357600080fd5b5035919050565b80356001600160a01b0381168114610ca357600080fd5b60006020828403121561110357600080fd5b61110c826110da565b9392505050565b60ff8116811461112257600080fd5b50565b6000806040838503121561113857600080fd5b823561114381611113565b9150611151602084016110da565b90509250929050565b6000806040838503121561116d57600080fd5b82359150611151602084016110da565b6000806000806080858703121561119357600080fd5b61119c856110da565b935060208501356111ac81611113565b92506111ba604086016110da565b9396929550929360600135925050565b6000806000606084860312156111df57600080fd5b83359250602084013580151581146111f657600080fd5b9150611204604085016110da565b90509250925092565b600081518084526020808501945080840160005b838110156112465781516001600160a01b031687529582019590820190600101611221565b509495945050505050565b6001600160a01b0388811682528716602082015260ff8681166040830152606082018690528416608082015260e060a082018190526000906112959083018561120d565b82810360c08401526112a7818561120d565b9a9950505050505050505050565b600080604083850312156112c857600080fd5b50508035926020909101359150565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156113a157888303603f19018552815180516001600160a01b0390811685528882015116888501528681015160ff16878501526060808201519085015260808082015160e091906113568288018260ff169052565b505060a080830151828288015261136f8388018261120d565b9250505060c0808301519250858203818701525061138d818361120d565b9689019694505050908601906001016112fe565b509098975050505050505050565b6020808252600b908201526a4f6e6c79206f776e65722160a81b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156113fe576113fe6113d4565b5060010190565b60008219821115611418576114186113d4565b500190565b6000815480845260208085019450836000528060002060005b838110156112465781546001600160a01b031687529582019560019182019101611436565b60408152600061146e604083018561141d565b8281036020840152611480818561141d565b95945050505050565b60006020828403121561149b57600080fd5b815161110c81611113565b6000828210156114b8576114b86113d4565b500390565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fdfea26469706673582212202722242e3b6e57d58d24efcb69cf52b88dbcc2c1e33fb95d0406bae9462e0a2764736f6c634300080b0033608060405234801561001057600080fd5b50604051610a2b380380610a2b83398101604081905261002f916101fe565b600080546001600160a01b03191633179055818161004c8261013c565b600180546001600160a01b0319166001600160a01b0383169081178255604080516322acb86760e01b815290516322acb867916004808201926020929091908290030181865afa1580156100a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100c89190610231565b63ffffffff1610156101335760405162461bcd60e51b815260206004820152602960248201527f636f6d6d6974746565206973206572726f722c20706c6561736520636865636b60448201526820616464726573732160b81b60648201526084015b60405180910390fd5b5050505061025e565b610145336101a1565b61017f5760405162461bcd60e51b815260206004820152600b60248201526a4f6e6c79206f776e65722160a81b604482015260640161012a565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382163014156101bc57506001919050565b6000546001600160a01b03838116911614156101da57506001919050565b506000919050565b919050565b80516001600160a01b03811681146101e257600080fd5b6000806040838503121561021157600080fd5b61021a836101e7565b9150610228602084016101e7565b90509250929050565b60006020828403121561024357600080fd5b815163ffffffff8116811461025757600080fd5b9392505050565b6107be8061026d6000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806301410de21461006757806313af403514610091578063185c1587146100a657806353bfcf2f146100d1578063b2bdfa7b146100e4578063cd5d2118146100f7575b600080fd5b61007a6100753660046104d1565b61011a565b60405160ff90911681526020015b60405180910390f35b6100a461009f366004610559565b61018c565b005b6001546100b9906001600160a01b031681565b6040516001600160a01b039091168152602001610088565b61007a6100df366004610633565b6101f5565b6000546100b9906001600160a01b031681565b61010a610105366004610559565b610467565b6040519015158152602001610088565b600061012960ff8416856106ad565b63ffffffff1661013a8660646106ad565b63ffffffff16101561014e57506001610183565b61015b8560ff84166106ad565b63ffffffff1661016c8760646106ad565b63ffffffff161061017f57506002610183565b5060035b95945050505050565b61019533610467565b6101d35760405162461bcd60e51b815260206004820152600b60248201526a4f6e6c79206f776e65722160a81b604482015260640160405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60015460405163965b9ff160e01b815260009182916001600160a01b039091169063965b9ff19061022a9087906004016106d9565b602060405180830381865afa158015610247573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026b9190610726565b60015460405163965b9ff160e01b81529192506000916001600160a01b039091169063965b9ff1906102a19087906004016106d9565b602060405180830381865afa1580156102be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e29190610726565b6102ec9083610743565b90506000600160009054906101000a90046001600160a01b03166001600160a01b03166322acb8676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610343573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103679190610726565b905061045d838383600160009054906101000a90046001600160a01b03166001600160a01b0316635615696f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e6919061076b565b600160009054906101000a90046001600160a01b03166001600160a01b031663b6fd90676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610439573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610075919061076b565b9695505050505050565b60006001600160a01b03821630141561048257506001919050565b6000546001600160a01b03838116911614156104a057506001919050565b506000919050565b919050565b63ffffffff811681146104bf57600080fd5b50565b60ff811681146104bf57600080fd5b600080600080600060a086880312156104e957600080fd5b85356104f4816104ad565b94506020860135610504816104ad565b93506040860135610514816104ad565b92506060860135610524816104c2565b91506080860135610534816104c2565b809150509295509295909350565b80356001600160a01b03811681146104a857600080fd5b60006020828403121561056b57600080fd5b61057482610542565b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126105a257600080fd5b8135602067ffffffffffffffff808311156105bf576105bf61057b565b8260051b604051601f19603f830116810181811084821117156105e4576105e461057b565b60405293845285810183019383810192508785111561060257600080fd5b83870191505b848210156106285761061982610542565b83529183019190830190610608565b979650505050505050565b6000806040838503121561064657600080fd5b823567ffffffffffffffff8082111561065e57600080fd5b61066a86838701610591565b9350602085013591508082111561068057600080fd5b5061068d85828601610591565b9150509250929050565b634e487b7160e01b600052601160045260246000fd5b600063ffffffff808316818516818304811182151516156106d0576106d0610697565b02949350505050565b6020808252825182820181905260009190848201906040850190845b8181101561071a5783516001600160a01b0316835292840192918401916001016106f5565b50909695505050505050565b60006020828403121561073857600080fd5b8151610574816104ad565b600063ffffffff80831681851680830382111561076257610762610697565b01949350505050565b60006020828403121561077d57600080fd5b8151610574816104c256fea26469706673582212207e324ba2bb41822f929f1314b540322ac6d0e6f01442a9d4e444f42878dcb0b364736f6c634300080b0033";
static const char* const committeeSmBin = "60806040523480156200001157600080fd5b5060405162005e9038038062005e9083398101604081905262000034916200022c565b83838383604051620000469062000103565b6200005594939291906200032f565b604051809103906000f08015801562000072573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b03929092169182179055604051309190620000a39062000111565b6001600160a01b03928316815291166020820152604001604051809103906000f080158015620000d7573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b039290921691909117905550620003d892505050565b611591806200287b83390190565b6120848062003e0c83390190565b63b95aa35560e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200016057620001606200011f565b604052919050565b60006001600160401b038211156200018457620001846200011f565b5060051b60200190565b600082601f830112620001a057600080fd5b81516020620001b9620001b38362000168565b62000135565b82815260059290921b84018101918181019086841115620001d957600080fd5b8286015b848110156200020a57805163ffffffff81168114620001fc5760008081fd5b8352918301918301620001dd565b509695505050505050565b805160ff811681146200022757600080fd5b919050565b600080600080608085870312156200024357600080fd5b84516001600160401b03808211156200025b57600080fd5b818701915087601f8301126200027057600080fd5b8151602062000283620001b38362000168565b82815260059290921b8401810191818101908b841115620002a357600080fd5b948201945b83861015620002da5785516001600160a01b0381168114620002ca5760008081fd5b82529482019490820190620002a8565b918a0151919850909350505080821115620002f457600080fd5b5062000303878288016200018e565b935050620003146040860162000215565b9150620003246060860162000215565b905092959194509250565b6080808252855190820181905260009060209060a0840190828901845b82811015620003735781516001600160a01b0316845292840192908401906001016200034c565b5050508381038285015286518082528783019183019060005b81811015620003b057835163ffffffff16835292840192918401916001016200038c565b505060ff871660408601529250620003c6915050565b60ff8316606083015295945050505050565b61249380620003e86000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063869328ad11610097578063cbca676d11610066578063cbca676d1461022a578063cfe0a26c1461023d578063d294443914610250578063de0033561461026357600080fd5b8063869328ad146101ac578063922b7906146101e1578063b5f23235146101f4578063ba2de76c1461021757600080fd5b80635b5cc736116100d35780635b5cc736146101465780635d826f401461015b57806368baf8bd1461016e5780637bc855161461019957600080fd5b80630cb0a8d9146100fa5780631f975035146101205780634489465614610133575b600080fd5b61010d610108366004611d5b565b610276565b6040519081526020015b60405180910390f35b61010d61012e366004611e53565b610363565b61010d610141366004611e98565b610471565b610159610154366004611ec4565b610759565b005b61010d610169366004611f06565b611064565b600154610181906001600160a01b031681565b6040516001600160a01b039091168152602001610117565b600054610181906001600160a01b031681565b6101cf6101ba366004611f70565b60009081526002602052604090205460ff1690565b60405160ff9091168152602001610117565b61010d6101ef366004611f89565b611185565b610207610202366004611fb9565b611381565b6040519015158152602001610117565b610159610225366004611f70565b6113f6565b61010d610238366004611fe5565b611483565b61010d61024b366004612015565b611614565b61010d61025e366004612082565b61173b565b61010d6102713660046120b2565b6117fe565b600061028133611381565b6102a757604051636381e58960e11b815260040161029e906120d0565b60405180910390fd5b6040805160018082528183019092526000916020808301908036833701905050905084816000815181106102dd576102dd6120fe565b60200260200101906001600160a01b031690816001600160a01b03168152505060608060006040518060e00160405280601660ff168152602001896001600160a01b03168152602001848152602001838152602001600063ffffffff1681526020018581526020018815158152509050610357818761198f565b98975050505050505050565b600061036e33611381565b61038b57604051636381e58960e11b815260040161029e906120d0565b60018351116103cd57604051636381e58960e11b815260206004820152600d60248201526c34b73b30b634b2103737b2329760991b604482015260640161029e565b6040805160018082528183019092526060918291600091816020015b60608152602001906001900390816103e95790505090508581600081518110610414576104146120fe565b6020908102919091018101919091526040805160e08101825260348152611003928101929092528101839052606081018290526000608082015260a08101849052600160c0820152610466818761198f565b979650505050505050565b600061047c33611381565b61049957604051636381e58960e11b815260040161029e906120d0565b600080546040805163749280c760e01b8152905160609384936001600160a01b03169263749280c792600480830193928290030181865afa1580156104e2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261050a91908101906121ac565b5060005460408051633de42a8b60e11b815290519296508994506001600160a01b03918216935090841691637bc85516916004808201926020929091908290030181865afa158015610560573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105849190612299565b6001600160a01b0316146105f057604051636381e58960e11b815260206004820152602c60248201527f6e657720766f746520636f6d707574657220636f6d6d6974746565206164647260448201526b0cae6e640dad2e6dac2e8c6d60a31b606482015260840161029e565b6040516308e2b09560e41b81526001600160a01b03821690638e2b09509061061e90869086906004016122fa565b602060405180830381865afa15801561063b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065f9190612328565b60ff166002146106b257604051636381e58960e11b815260206004820152601e60248201527f6e657720766f746520636f6d707574657220696d70657266656374696f6e0000604482015260640161029e565b6040805160018082528183019092526000916020808301908036833701905050905060608088836000815181106106eb576106eb6120fe565b6001600160a01b039283166020918202929092018101919091526040805160e081018252600d81526001549093169183019190915281018390526060810182905260006080820181905260a0820185905260c082015261074b818a61198f565b9a9950505050505050505050565b61076233611381565b61077f57604051636381e58960e11b815260040161029e906120d0565b6001546040516368b739c960e01b81526004810184905282151560248201523360448201526000916001600160a01b0316906368b739c9906064016020604051808303816000875af11580156107d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fd9190612328565b90506108536040518060e00160405280600060ff16815260200160006001600160a01b031681526020016060815260200160608152602001600063ffffffff168152602001606081526020016000151581525090565b8160ff166002141561105e5760008481526002602090815260408083208054825160e08101845260ff82168082526101009092046001600160a01b031681860152600183018054855181880281018801875281815293969295860193928301828280156108fd57602002820191906000526020600020906000905b825461010083900a900460ff168152602060019283018181049485019490930390920291018084116108ce5790505b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156109d757838290600052602060002001805461094a90612345565b80601f016020809104026020016040519081016040528092919081815260200182805461097690612345565b80156109c35780601f10610998576101008083540402835291602001916109c3565b820191906000526020600020905b8154815290600101906020018083116109a657829003601f168201915b50505050508152602001906001019061092b565b50505090825250600382015463ffffffff166020808301919091526004830180546040805182850281018501825282815294019392830182828015610a4557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a27575b50505091835250506005919091015460ff90811615156020909201919091529093508116600b1415610ba557608083015163ffffffff16610b0157336001600160a01b03168360a00151600081518110610aa157610aa16120fe565b60200260200101516001600160a01b03161415610b0157604051636381e58960e11b815260206004820152601c60248201527f596f752063616e206e6f742072656d6f766520796f757273656c662100000000604482015260640161029e565b6000805460a085015180516001600160a01b0390921692639067531d92610b2a57610b2a6120fe565b602002602001015185608001516040518363ffffffff1660e01b8152600401610b6e9291906001600160a01b0392909216825263ffffffff16602082015260400190565b600060405180830381600087803b158015610b8857600080fd5b505af1158015610b9c573d6000803e3d6000fd5b50505050611028565b8060ff16600c1415610c2d5760008054604085015180516001600160a01b03909216926358dd53d992610bda57610bda6120fe565b60200260200101518560400151600181518110610bf957610bf96120fe565b60200260200101516040518363ffffffff1660e01b8152600401610b6e92919060ff92831681529116602082015260400190565b8060ff16600d1415610c985760015460a084015180516001600160a01b039092169163ecbea6bc9190600090610c6557610c656120fe565b60200260200101516040518263ffffffff1660e01b8152600401610b6e91906001600160a01b0391909116815260200190565b8060ff1660151415610d43576110056001600160a01b031663b0ca889b8460400151600081518110610ccc57610ccc6120fe565b60200260200101516040518263ffffffff1660e01b8152600401610cf9919060ff91909116815260200190565b6020604051808303816000875af1158015610d18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3c9190612380565b9150611028565b8060ff1660161415610ddc578260c0015115610db4576110056001600160a01b031663026a22fd8460a00151600081518110610d8157610d816120fe565b60200260200101516040518263ffffffff1660e01b8152600401610cf991906001600160a01b0391909116815260200190565b6110056001600160a01b0316631a2052518460a00151600081518110610d8157610d816120fe565b8060ff16601f1415610e4f576110056001600160a01b03166302b3703b84602001518560a00151600081518110610e1557610e156120fe565b60200260200101516040518363ffffffff1660e01b8152600401610cf99291906001600160a01b0392831681529116602082015260400190565b8060ff1660291415610ec7576110006001600160a01b0316630749b5188460600151600081518110610e8357610e836120fe565b60200260200101518560600151600181518110610ea257610ea26120fe565b60200260200101516040518363ffffffff1660e01b8152600401610cf99291906123e6565b8060ff1660331415610fb8578260c0015115610f9057608083015163ffffffff16610f38576110036001600160a01b03166325e85d168460600151600081518110610f1457610f146120fe565b60200260200101516040518263ffffffff1660e01b8152600401610cf9919061240b565b6110036001600160a01b03166350f4c5098460600151600081518110610f6057610f606120fe565b6020026020010151856080015163ffffffff166040518363ffffffff1660e01b8152600401610cf992919061241e565b6110036001600160a01b0316639fdc9df88460600151600081518110610f6057610f606120fe565b8060ff1660341415610fec576110036001600160a01b03166386b733f98460600151600081518110610f1457610f146120fe565b604051636381e58960e11b815260206004820152601060248201526f3b37ba32903a3cb8329032b93937b91760811b604482015260640161029e565b6040518281527f406818d541a0d6840b3ed377d6be620edc0ffdb3912d08690fca6715d14512229060200160405180910390a150505b50505050565b600061106f33611381565b61108c57604051636381e58960e11b815260040161029e906120d0565b60018551116110ce57604051636381e58960e11b815260206004820152600d60248201526c34b73b30b634b2103737b2329760991b604482015260640161029e565b6040805160018082528183019092526060918291600091816020015b60608152602001906001900390816110ea5790505090508781600081518110611115576111156120fe565b602002602001018190525060006040518060e00160405280603360ff1681526020016110036001600160a01b031681526020018481526020018381526020018963ffffffff1681526020018581526020018815158152509050611178818761198f565b9998505050505050505050565b600061119033611381565b6111ad57604051636381e58960e11b815260040161029e906120d0565b6001600160a01b03831661120457604051636381e58960e11b815260206004820152601c60248201527f636f6e74726163742061646472657373206e6f74206578697374732e00000000604482015260640161029e565b6040516205d1af60e31b81526001600160a01b038416600482015261100590622e8d7890602401602060405180830381865afa158015611248573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126c9190612299565b6001600160a01b0316846001600160a01b031614156112eb57604051636381e58960e11b815260206004820152603460248201527f746865206163636f756e7420686173206265656e207468652061646d696e206f604482015273331031b7b731bab9393a1031b7b73a3930b1ba1760611b606482015260840161029e565b604080516001808252818301909252600091602080830190803683370190505090506060808683600081518110611324576113246120fe565b6001600160a01b039283166020918202929092018101919091526040805160e081018252601f81529289169183019190915281018390526060810182905260006080820181905260a0820185905260c0820152610357818761198f565b6000805460405163b5f2323560e01b81526001600160a01b0384811660048301529091169063b5f2323590602401602060405180830381865afa1580156113cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f09190612440565b92915050565b6113ff33611381565b61141c57604051636381e58960e11b815260040161029e906120d0565b6001546040516394d8f86f60e01b8152600481018390523360248201526001600160a01b03909116906394d8f86f90604401600060405180830381600087803b15801561146857600080fd5b505af115801561147c573d6000803e3d6000fd5b5050505050565b600061148e33611381565b6114ab57604051636381e58960e11b815260040161029e906120d0565b60648460ff16111561150a57604051636381e58960e11b815260206004820152602160248201527f696e76616c69642072616e6765206f66207061727469636970617465735261746044820152606560f81b606482015260840161029e565b60648360ff16111561155f57604051636381e58960e11b815260206004820152601860248201527f696e76616c69642072616e6765206f662077696e526174650000000000000000604482015260640161029e565b604080516002808252606080830184529260009291906020830190803683370190505090506060868260008151811061159a5761159a6120fe565b602002602001019060ff16908160ff168152505085826001815181106115c2576115c26120fe565b60ff9092166020928302919091018201526040805160e081018252600c8152309281019290925281018390526060810182905260006080820181905260a0820185905260c0820152610357818761198f565b600061161f33611381565b61163c57604051636381e58960e11b815260040161029e906120d0565b600184511161168457604051636381e58960e11b815260206004820152601360248201527234b73b30b634b21035b2bc903632b733ba341760691b604482015260640161029e565b60408051600280825260608281019093528291600091816020015b606081526020019060019003908161169f57905050905086816000815181106116ca576116ca6120fe565b602002602001018190525085816001815181106116e9576116e96120fe565b6020908102919091018101919091526040805160e081018252602981526110009281019290925281018390526060810182905260006080820181905260a0820185905260c0820152610357818761198f565b600061174633611381565b61176357604051636381e58960e11b815260040161029e906120d0565b60408051600180825281830190925260009160208083019080368337019050509050606080868360008151811061179c5761179c6120fe565b6001600160a01b039283166020918202929092018101919091526040805160e081018252600b8152928a169183019190915281018390526060810182905263ffffffff8716608082015260a08101849052600160c0820152610357818761198f565b600061180933611381565b61182657604051636381e58960e11b815260040161029e906120d0565b8260ff166110056001600160a01b031663598ab5966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561186a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188e9190612380565b141561190357604051636381e58960e11b815260206004820152603b60248201527f7468652063757272656e74206465706c6f79206175746820747970652069732060448201527f7468652073616d6520617320796f752077616e7420746f207365740000000000606482015260840161029e565b60408051600180825281830190925260609160009190602080830190803683370190505090506060858260008151811061193f5761193f6120fe565b60ff9092166020928302919091018201526040805160e081018252601581526110059281019290925281018390526060810182905260006080820181905260a0820185905260c082015261046681875b60015482516020840151604051631ca37ba360e11b815233600482015260ff90921660248301526001600160a01b039081166044830152606482018490526000928392911690633946f746906084016020604051808303816000875af11580156119fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a219190612380565b60008181526002602090815260409182902087518154838a01516001600160a01b0316610100026001600160a81b031990911660ff909216919091171781559187015180519394508793611a7b9260018501920190611b01565b5060608201518051611a97916002840191602090910190611ba7565b50608082015160038201805463ffffffff191663ffffffff90921691909117905560a08201518051611ad3916004840191602090910190611c00565b5060c091909101516005909101805460ff1916911515919091179055611afa816001610759565b9392505050565b82805482825590600052602060002090601f01602090048101928215611b975791602002820160005b83821115611b6857835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302611b2a565b8015611b955782816101000a81549060ff0219169055600101602081600001049283019260010302611b68565b505b50611ba3929150611c55565b5090565b828054828255906000526020600020908101928215611bf4579160200282015b82811115611bf45782518051611be4918491602090910190611c6a565b5091602001919060010190611bc7565b50611ba3929150611cde565b828054828255906000526020600020908101928215611b97579160200282015b82811115611b9757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611c20565b5b80821115611ba35760008155600101611c56565b828054611c7690612345565b90600052602060002090601f016020900481019282611c985760008555611b97565b82601f10611cb157805160ff1916838001178555611b97565b82800160010185558215611b97579182015b82811115611b97578251825591602001919060010190611cc3565b80821115611ba3576000611cf28282611cfb565b50600101611cde565b508054611d0790612345565b6000825580601f10611d17575050565b601f016020900490600052602060002090810190611d359190611c55565b50565b6001600160a01b0381168114611d3557600080fd5b8015158114611d3557600080fd5b600080600060608486031215611d7057600080fd5b8335611d7b81611d38565b92506020840135611d8b81611d4d565b929592945050506040919091013590565b63b95aa35560e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ddb57611ddb611d9c565b604052919050565b600082601f830112611df457600080fd5b813567ffffffffffffffff811115611e0e57611e0e611d9c565b611e21601f8201601f1916602001611db2565b818152846020838601011115611e3657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215611e6657600080fd5b823567ffffffffffffffff811115611e7d57600080fd5b611e8985828601611de3565b95602094909401359450505050565b60008060408385031215611eab57600080fd5b8235611eb681611d38565b946020939093013593505050565b60008060408385031215611ed757600080fd5b823591506020830135611ee981611d4d565b809150509250929050565b63ffffffff81168114611d3557600080fd5b60008060008060808587031215611f1c57600080fd5b843567ffffffffffffffff811115611f3357600080fd5b611f3f87828801611de3565b9450506020850135611f5081611ef4565b92506040850135611f6081611d4d565b9396929550929360600135925050565b600060208284031215611f8257600080fd5b5035919050565b600080600060608486031215611f9e57600080fd5b8335611fa981611d38565b92506020840135611d8b81611d38565b600060208284031215611fcb57600080fd5b8135611afa81611d38565b60ff81168114611d3557600080fd5b600080600060608486031215611ffa57600080fd5b833561200581611fd6565b92506020840135611d8b81611fd6565b60008060006060848603121561202a57600080fd5b833567ffffffffffffffff8082111561204257600080fd5b61204e87838801611de3565b9450602086013591508082111561206457600080fd5b5061207186828701611de3565b925050604084013590509250925092565b60008060006060848603121561209757600080fd5b83356120a281611d38565b92506020840135611d8b81611ef4565b600080604083850312156120c557600080fd5b8235611eb681611fd6565b6020808252601490820152733cb7ba9036bab9ba1031329033b7bb32b93737b960611b604082015260600190565b63b95aa35560e01b600052603260045260246000fd5b600067ffffffffffffffff82111561212e5761212e611d9c565b5060051b60200190565b600082601f83011261214957600080fd5b8151602061215e61215983612114565b611db2565b82815260059290921b8401810191818101908684111561217d57600080fd5b8286015b848110156121a157805161219481611ef4565b8352918301918301612181565b509695505050505050565b600080600080608085870312156121c257600080fd5b84516121cd81611fd6565b809450506020808601516121e081611fd6565b604087015190945067ffffffffffffffff808211156121fe57600080fd5b818801915088601f83011261221257600080fd5b815161222061215982612114565b81815260059190911b8301840190848101908b83111561223f57600080fd5b938501935b8285101561226657845161225781611d38565b82529385019390850190612244565b60608b0151909750945050508083111561227f57600080fd5b505061228d87828801612138565b91505092959194509250565b6000602082840312156122ab57600080fd5b8151611afa81611d38565b600081518084526020808501945080840160005b838110156122ef5781516001600160a01b0316875295820195908201906001016122ca565b509495945050505050565b60408152600061230d60408301856122b6565b828103602084015261231f81856122b6565b95945050505050565b60006020828403121561233a57600080fd5b8151611afa81611fd6565b600181811c9082168061235957607f821691505b6020821081141561237a5763b95aa35560e01b600052602260045260246000fd5b50919050565b60006020828403121561239257600080fd5b5051919050565b6000815180845260005b818110156123bf576020818501810151868301820152016123a3565b818111156123d1576000602083870101525b50601f01601f19169290920160200192915050565b6040815260006123f96040830185612399565b828103602084015261231f8185612399565b602081526000611afa6020830184612399565b6040815260006124316040830185612399565b90508260208301529392505050565b60006020828403121561245257600080fd5b8151611afa81611d4d56fea264697066735822122025c2ff1d74d5fbc92a29d8fcf59aa314bd7c9bf9dc3bd91e399198263194f85e64736f6c634300080b003360806040523480156200001157600080fd5b50604051620015913803806200159183398101604081905262000034916200072a565b600080546001600160a01b031916331781555b84518163ffffffff161015620000c257620000ad858263ffffffff16815181106200007657620000766200082d565b6020026020010151858363ffffffff16815181106200009957620000996200082d565b6020026020010151620000fb60201b60201c565b80620000b98162000859565b91505062000047565b506004805461ffff191661010060ff8481169190910260ff191691909117908416179055620000f13362000289565b50505050620008cb565b6200010633620002f3565b6200014757604051636381e58960e11b815260206004820152600b60248201526a4f6e6c79206f776e65722160a81b60448201526064015b60405180910390fd5b63ffffffff8116620001f2576001600160a01b038216321415620001af57604051636381e58960e11b815260206004820152601c60248201527f596f752063616e206e6f742072656d6f766520796f757273656c66210000000060448201526064016200013e565b6001600160a01b0382166000908152600360209081526040909120805463ffffffff19169055620001ee906001908490620005c86200033b821b17901c565b5050565b6200020d826001620004da60201b620007471790919060201c565b1562000242576001600160a01b0382166000908152600360205260409020805463ffffffff191663ffffffff83161790555050565b6001600160a01b0382166000908152600360209081526040909120805463ffffffff191663ffffffff8416179055620001ee906001908490620004f8811b6200076517901c565b6200029433620002f3565b620002d157604051636381e58960e11b815260206004820152600b60248201526a4f6e6c79206f776e65722160a81b60448201526064016200013e565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382163014156200030f57506001919050565b6000546001600160a01b03838116911614156200032e57506001919050565b506000919050565b919050565b6001600160a01b038116600090815260208390526040902054620003af57604051636381e58960e11b815260206004820152602360248201527f4c6962416464726573735365743a2076616c756520646f65736e27742065786960448201526239ba1760e91b60648201526084016200013e565b6001600160a01b038116600090815260208390526040812054620003d69060019062000880565b600184810154919250600091620003ee919062000880565b905060008460010182815481106200040a576200040a6200082d565b6000918252602090912001546001860180546001600160a01b0390921692508291859081106200043e576200043e6200082d565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055620004748360016200089a565b6001600160a01b038083166000908152602088905260408082209390935590861681529081205560018501805480620004b157620004b1620008b5565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6001600160a01b031660009081526020919091526040902054151590565b6001600160a01b0381166200055b57604051636381e58960e11b815260206004820152602160248201527f4c6962416464726573735365743a2076616c75652063616e27742062652030786044820152600360fc1b60648201526084016200013e565b6001600160a01b03811660009081526020839052604090205415620005dc57604051636381e58960e11b815260206004820152602f60248201527f4c6962416464726573735365743a2076616c756520616c72656164792065786960448201526e39ba399034b7103a34329039b2ba1760891b60648201526084016200013e565b6001808301805491820181556000818152602080822090930180546001600160a01b039095166001600160a01b0319909516851790559054928152929052604090912055565b63b95aa35560e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000663576200066362000622565b604052919050565b60006001600160401b0382111562000687576200068762000622565b5060051b60200190565b600082601f830112620006a357600080fd5b81516020620006bc620006b6836200066b565b62000638565b82815260059290921b84018101918181019086841115620006dc57600080fd5b8286015b848110156200070d57805163ffffffff81168114620006ff5760008081fd5b8352918301918301620006e0565b509695505050505050565b805160ff811681146200033657600080fd5b600080600080608085870312156200074157600080fd5b84516001600160401b03808211156200075957600080fd5b818701915087601f8301126200076e57600080fd5b8151602062000781620006b6836200066b565b82815260059290921b8401810191818101908b841115620007a157600080fd5b948201945b83861015620007d85785516001600160a01b0381168114620007c85760008081fd5b82529482019490820190620007a6565b918a0151919850909350505080821115620007f257600080fd5b50620008018782880162000691565b935050620008126040860162000718565b9150620008226060860162000718565b905092959194509250565b63b95aa35560e01b600052603260045260246000fd5b63b95aa35560e01b600052601160045260246000fd5b600063ffffffff8083168181141562000876576200087662000843565b6001019392505050565b60008282101562000895576200089562000843565b500390565b60008219821115620008b057620008b062000843565b500190565b63b95aa35560e01b600052603160045260246000fd5b610cb680620008db6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c806358dd53d91161007157806358dd53d91461015f5780636e0376d414610172578063749280c7146101955780639067531d146101ad578063b5f23235146101c0578063c77695e4146101d357600080fd5b806305282c70146100b957806307f44999146100ce5780630e878ed0146100f757806323bdace11461010457806328e914891461012c57806337df996214610157575b600080fd5b6100cc6100c7366004610960565b610202565b005b6004546100e090610100900460ff1681565b60405160ff90911681526020015b60405180910390f35b6004546100e09060ff1681565b610117610112366004610998565b610253565b60405163ffffffff90911681526020016100ee565b60005461013f906001600160a01b031681565b6040516001600160a01b0390911681526020016100ee565b6101176102d2565b6100cc61016d366004610a6e565b6102e6565b610185610180366004610960565b61032f565b60405190151581526020016100ee565b61019d610375565b6040516100ee9493929190610aa1565b6100cc6101bb366004610b43565b61047a565b6101856101ce366004610960565b6105b5565b6101176101e1366004610960565b6001600160a01b031660009081526003602052604090205463ffffffff1690565b61020b3361032f565b61023157604051636381e58960e11b815260040161022890610b83565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080805b83518163ffffffff1610156102cb5760036000858363ffffffff168151811061028357610283610ba8565b6020908102919091018101516001600160a01b03168252810191909152604001600020546102b79063ffffffff1683610bd4565b9150806102c381610bfc565b915050610258565b5092915050565b60006102e1610112600161087c565b905090565b6102ef3361032f565b61030c57604051636381e58960e11b815260040161022890610b83565b6004805461ffff191661010060ff9384160260ff19161792909116919091179055565b60006001600160a01b03821630141561034a57506001919050565b6000546001600160a01b038381169116141561036857506001919050565b506000919050565b919050565b600080606080610385600161087c565b9150815167ffffffffffffffff8111156103a1576103a1610982565b6040519080825280602002602001820160405280156103ca578160200160208202803683370190505b50905060005b825181101561046157600360008483815181106103ef576103ef610ba8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a900463ffffffff1682828151811061043a5761043a610ba8565b63ffffffff909216602092830291909101909101528061045981610c20565b9150506103d0565b5060045460ff8082169661010090920416945091925090565b6104833361032f565b6104a057604051636381e58960e11b815260040161022890610b83565b63ffffffff8116610537576001600160a01b03821632141561050557604051636381e58960e11b815260206004820152601c60248201527f596f752063616e206e6f742072656d6f766520796f757273656c6621000000006044820152606401610228565b6001600160a01b0382166000908152600360205260409020805463ffffffff191690556105336001836105c8565b5050565b610542600183610747565b15610576576001600160a01b0382166000908152600360205260409020805463ffffffff191663ffffffff83161790555050565b6001600160a01b0382166000908152600360205260409020805463ffffffff191663ffffffff8381169190911790915561053390600190849061076516565b60006105c2600183610747565b92915050565b6105d28282610747565b61062b57604051636381e58960e11b815260206004820152602360248201527f4c6962416464726573735365743a2076616c756520646f65736e27742065786960448201526239ba1760e91b6064820152608401610228565b6001600160a01b03811660009081526020839052604081205461065090600190610c3b565b6001848101549192506000916106669190610c3b565b9050600084600101828154811061067f5761067f610ba8565b6000918252602090912001546001860180546001600160a01b0390921692508291859081106106b0576106b0610ba8565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790556106e4836001610c52565b6001600160a01b03808316600090815260208890526040808220939093559086168152908120556001850180548061071e5761071e610c6a565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6001600160a01b031660009081526020919091526040902054151590565b6001600160a01b0381166107c657604051636381e58960e11b815260206004820152602160248201527f4c6962416464726573735365743a2076616c75652063616e27742062652030786044820152600360fc1b6064820152608401610228565b6107d08282610747565b1561083657604051636381e58960e11b815260206004820152602f60248201527f4c6962416464726573735365743a2076616c756520616c72656164792065786960448201526e39ba399034b7103a34329039b2ba1760891b6064820152608401610228565b6001808301805491820181556000818152602080822090930180546001600160a01b039095166001600160a01b0319909516851790559054928152929052604090912055565b600181015460609060009067ffffffffffffffff81111561089f5761089f610982565b6040519080825280602002602001820160405280156108c8578160200160208202803683370190505b50905060005b60018401548110156102cb578360010181815481106108ef576108ef610ba8565b9060005260206000200160009054906101000a90046001600160a01b031682828151811061091f5761091f610ba8565b6001600160a01b03909216602092830291909101909101528061094181610c20565b9150506108ce565b80356001600160a01b038116811461037057600080fd5b60006020828403121561097257600080fd5b61097b82610949565b9392505050565b63b95aa35560e01b600052604160045260246000fd5b600060208083850312156109ab57600080fd5b823567ffffffffffffffff808211156109c357600080fd5b818501915085601f8301126109d757600080fd5b8135818111156109e9576109e9610982565b8060051b604051601f19603f83011681018181108582111715610a0e57610a0e610982565b604052918252848201925083810185019188831115610a2c57600080fd5b938501935b82851015610a5157610a4285610949565b84529385019392850192610a31565b98975050505050505050565b803560ff8116811461037057600080fd5b60008060408385031215610a8157600080fd5b610a8a83610a5d565b9150610a9860208401610a5d565b90509250929050565b60006080820160ff87168352602060ff8716818501526080604085015281865180845260a086019150828801935060005b81811015610af75784516001600160a01b031683529383019391830191600101610ad2565b50508481036060860152855180825290820192508186019060005b81811015610b3457825163ffffffff1685529383019391830191600101610b12565b50929998505050505050505050565b60008060408385031215610b5657600080fd5b610b5f83610949565b9150602083013563ffffffff81168114610b7857600080fd5b809150509250929050565b6020808252600b908201526a4f6e6c79206f776e65722160a81b604082015260600190565b63b95aa35560e01b600052603260045260246000fd5b63b95aa35560e01b600052601160045260246000fd5b600063ffffffff808316818516808303821115610bf357610bf3610bbe565b01949350505050565b600063ffffffff80831681811415610c1657610c16610bbe565b6001019392505050565b6000600019821415610c3457610c34610bbe565b5060010190565b600082821015610c4d57610c4d610bbe565b500390565b60008219821115610c6557610c65610bbe565b500190565b63b95aa35560e01b600052603160045260246000fdfea26469706673582212209d87ae3059ef7c4e89a9812d140136cc3f2e1d099fad7b316cba2f4d2bc5b06a64736f6c634300080b003360806040523480156200001157600080fd5b5060405162002084380380620020848339810160408190526200003491620000e1565b600080546001600160a01b03191633179055604051829082906200005890620000b6565b6001600160a01b03928316815291166020820152604001604051809103906000f0801580156200008c573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b039290921691909117905550620001199050565b610a2e806200165683390190565b80516001600160a01b0381168114620000dc57600080fd5b919050565b60008060408385031215620000f557600080fd5b6200010083620000c4565b91506200011060208401620000c4565b90509250929050565b61152d80620001296000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806389ebc3b711610097578063d47e52c211610066578063d47e52c2146102c8578063e59e7b34146102f3578063ec84604414610306578063ecbea6bc1461032c57600080fd5b806389ebc3b71461025b57806394d8f86f1461028257806398159bb514610295578063c0b560c2146102b557600080fd5b806362e7ec50116100d357806362e7ec50146101f757806368b739c9146102005780636e0376d41461022557806386840d091461024857600080fd5b806302ad26cc1461010557806305282c701461019657806328e91489146101ab5780633946f746146101d6575b600080fd5b6101586101133660046110cf565b600360208190526000918252604090912080546001820154600283015492909301546001600160a01b03918216939182169260ff600160a01b90930483169290911685565b604080516001600160a01b03968716815295909416602086015260ff92831693850193909352606084015216608082015260a0015b60405180910390f35b6101a96101a43660046110ff565b61033f565b005b6000546101be906001600160a01b031681565b6040516001600160a01b03909116815260200161018d565b6101e96101e4366004611133565b610390565b60405190815260200161018d565b6101e960025481565b61021361020e366004611180565b6105d4565b60405160ff909116815260200161018d565b6102386102333660046110ff565b610928565b604051901515815260200161018d565b6101e96102563660046111c3565b61096e565b6102136102693660046110cf565b6000908152600360208190526040909120015460ff1690565b6101a96102903660046111f8565b61099c565b6102a86102a336600461121b565b610ab1565b60405161018d9190611281565b6001546101be906001600160a01b031681565b6101e96102d63660046111c3565b600460209081526000928352604080842090915290825290205481565b6102136103013660046110cf565b610db2565b6103196103143660046110cf565b610e5f565b60405161018d9796959493929190611359565b6101a961033a3660046110ff565b610f6d565b61034833610928565b61036e57604051636381e58960e11b8152600401610365906113bd565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600061039b33610928565b6103b857604051636381e58960e11b8152600401610365906113bd565b60ff80851660009081526004602090815260408083206001600160a01b038816845282528083205480845260039283905292200154909116600114156104035761040181610db2565b505b6000818152600360208190526040909120015460ff166001141561046a57604051636381e58960e11b815260206004820152601860248201527f43757272656e742070726f706f73616c206e6f7420656e6400000000000000006044820152606401610365565b6002805490600061047a836113f8565b91905055506000600254905060608060006040518060e00160405280896001600160a01b031681526020018b6001600160a01b031681526020018a60ff16815260200188436104c99190611413565b815260016020808301829052604080840188905260609384018790526000898152600380845290829020865181546001600160a01b0319166001600160a01b0391821617825587850151958201805494890151969091166001600160a81b031990941693909317600160a01b60ff96871602179092559385015160028201556080850151938101805460ff1916949093169390931790915560a08301518051939450849361057d9260048501920190611055565b5060c08201518051610599916005840191602090910190611055565b50505060ff891660009081526004602090815260408083206001600160a01b038c168452909152902084905550919350505050949350505050565b60006105df33610928565b6105fc57604051636381e58960e11b8152600401610365906113bd565b60008481526003602081905260409091200154849060ff1661065657604051636381e58960e11b8152602060048201526012602482015271141c9bdc1bdcd85b081b9bdd08195e1a5cdd60721b6044820152606401610365565b60008581526003602081905260409091200154859060ff166001146106be57604051636381e58960e11b815260206004820152601760248201527f50726f706f73616c206973206e6f7420766f7461626c650000000000000000006044820152606401610365565b600086815260036020818152604092839020835160e08101855281546001600160a01b03908116825260018301549081168285015260ff600160a01b9091048116828701526002830154606083015293820154909316608084015260048101805485518185028101850190965280865291946107e79493869360a08601939183018282801561077657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610758575b50505050508152602001600582018054806020026020016040519081016040528092919081815260200182805480156107d857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107ba575b50505050508152505086610fb5565b1561082557604051636381e58960e11b815260206004820152600d60248201526c105b1c9958591e481d9bdd1959609a1b6044820152606401610365565b851561086057600481018054600181018255600091825260209091200180546001600160a01b0319166001600160a01b038716179055610891565b600581018054600181018255600091825260209091200180546001600160a01b0319166001600160a01b0387161790555b6001546040516308e2b09560e41b81526000916001600160a01b031690638e2b0950906108c990600480870191600588019101611469565b602060405180830381865afa1580156108e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090a9190611497565b600392909201805460ff191660ff8416179055509695505050505050565b60006001600160a01b03821630141561094357506001919050565b6000546001600160a01b038381169116141561096157506001919050565b506000919050565b919050565b60ff821660009081526004602090815260408083206001600160a01b03851684529091529020545b92915050565b6109a533610928565b6109c257604051636381e58960e11b8152600401610365906113bd565b60008281526003602052604090206109d983610db2565b60ff16600114610a3f57604051636381e58960e11b815260206004820152602a60248201527f4f6e6c79206e65776c7920637265617465642070726f706f73616c2063616e206044820152691899481c995d9bdad95960b21b6064820152608401610365565b60018101546001600160a01b03838116911614610a9f57604051636381e58960e11b815260206004820152601860248201527f4f6e6c792070726f706f7365722063616e207265766f6b6500000000000000006044820152606401610365565b600301805460ff191660041790555050565b6060600254831115610b1557604051636381e58960e11b815260206004820152602660248201527f2766726f6d272069732067726561746572207468616e202770726f706f73616c604482015265436f756e742760d01b6064820152608401610365565b81831115610b6657604051636381e58960e11b815260206004820152601b60248201527f2766726f6d272069732067726561746572207468616e2027746f2700000000006044820152606401610365565b600254821115610b765760025491505b6001831015610b8457600192505b6000610b9084846114b4565b610b9b906001611413565b67ffffffffffffffff811115610bb357610bb36114cb565b604051908082528060200260200182016040528015610c3c57816020015b610c296040518060e0016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600060ff16815260200160008152602001600060ff16815260200160608152602001606081525090565b815260200190600190039081610bd15790505b5090506000845b848111610da857600081815260036020818152604092839020835160e08101855281546001600160a01b03908116825260018301549081168285015260ff600160a01b909104811682870152600283015460608301529382015490931660808401526004810180548551818502810185019096528086529194859360a086019391929190830182828015610d0057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ce2575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015610d6257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d44575b505050505081525050848480610d77906113f8565b955081518110610d8957610d896114e1565b6020026020010181905250508080610da0906113f8565b915050610c43565b5090949350505050565b600081815260036020819052604082200154829060ff16610e0b57604051636381e58960e11b8152602060048201526012602482015271141c9bdc1bdcd85b081b9bdd08195e1a5cdd60721b6044820152606401610365565b60008381526003602081905260409091209081015460ff1660011415610e4f578060020154431115610e4f57600301805460ff191660059081179091559150610e59565b6003015460ff1691505b50919050565b600081815260036020818152604092839020805460018201546002830154948301546004840180548851818802810188019099528089526001600160a01b039485169894841697600160a01b90940460ff908116979496931694606094859493919290830182828015610efb57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610edd575b5050505050925080600501805480602002602001604051908101604052809291908181526020018280548015610f5a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f3c575b5050505050915050919395979092949650565b610f7633610928565b610f9357604051636381e58960e11b8152600401610365906113bd565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000610fc58360a0015183610fef565b80610fd95750610fd98360c0015183610fef565b15610fe657506001610996565b50600092915050565b6000805b835181101561104b5783818151811061100e5761100e6114e1565b60200260200101516001600160a01b0316836001600160a01b03161415611039576001915050610996565b80611043816113f8565b915050610ff3565b5060009392505050565b8280548282559060005260206000209081019282156110aa579160200282015b828111156110aa57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611075565b506110b69291506110ba565b5090565b5b808211156110b657600081556001016110bb565b6000602082840312156110e157600080fd5b5035919050565b80356001600160a01b038116811461096957600080fd5b60006020828403121561111157600080fd5b61111a826110e8565b9392505050565b60ff8116811461113057600080fd5b50565b6000806000806080858703121561114957600080fd5b611152856110e8565b9350602085013561116281611121565b9250611170604086016110e8565b9396929550929360600135925050565b60008060006060848603121561119557600080fd5b83359250602084013580151581146111ac57600080fd5b91506111ba604085016110e8565b90509250925092565b600080604083850312156111d657600080fd5b82356111e181611121565b91506111ef602084016110e8565b90509250929050565b6000806040838503121561120b57600080fd5b823591506111ef602084016110e8565b6000806040838503121561122e57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156112765781516001600160a01b031687529582019590820190600101611251565b509495945050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561134b57888303603f19018552815180516001600160a01b0390811685528882015116888501528681015160ff16878501526060808201519085015260808082015160e091906113008288018260ff169052565b505060a08083015182828801526113198388018261123d565b9250505060c08083015192508582038187015250611337818361123d565b9689019694505050908601906001016112a8565b509098975050505050505050565b6001600160a01b0388811682528716602082015260ff8681166040830152606082018690528416608082015260e060a0820181905260009061139d9083018561123d565b82810360c08401526113af818561123d565b9a9950505050505050505050565b6020808252600b908201526a4f6e6c79206f776e65722160a81b604082015260600190565b63b95aa35560e01b600052601160045260246000fd5b600060001982141561140c5761140c6113e2565b5060010190565b60008219821115611426576114266113e2565b500190565b6000815480845260208085019450836000528060002060005b838110156112765781546001600160a01b031687529582019560019182019101611444565b60408152600061147c604083018561142b565b828103602084015261148e818561142b565b95945050505050565b6000602082840312156114a957600080fd5b815161111a81611121565b6000828210156114c6576114c66113e2565b500390565b63b95aa35560e01b600052604160045260246000fd5b63b95aa35560e01b600052603260045260246000fdfea26469706673582212205bbf6564dd81edaf252007f48f4aa3987af9ad8d4f92c6308579d2c64edc7f1664736f6c634300080b0033608060405234801561001057600080fd5b50604051610a2e380380610a2e83398101604081905261002f91610200565b600080546001600160a01b03191633179055818161004c8261013d565b600180546001600160a01b0319166001600160a01b038316908117825560408051631befccb160e11b815290516337df9962916004808201926020929091908290030181865afa1580156100a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100c89190610233565b63ffffffff16101561013457604051636381e58960e11b815260206004820152602960248201527f636f6d6d6974746565206973206572726f722c20706c6561736520636865636b60448201526820616464726573732160b81b60648201526084015b60405180910390fd5b50505050610260565b610146336101a3565b61018157604051636381e58960e11b815260206004820152600b60248201526a4f6e6c79206f776e65722160a81b604482015260640161012b565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382163014156101be57506001919050565b6000546001600160a01b03838116911614156101dc57506001919050565b506000919050565b919050565b80516001600160a01b03811681146101e457600080fd5b6000806040838503121561021357600080fd5b61021c836101e9565b915061022a602084016101e9565b90509250929050565b60006020828403121561024557600080fd5b815163ffffffff8116811461025957600080fd5b9392505050565b6107bf8061026f6000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806305282c701461006757806328e914891461007c5780636e0376d4146100ac5780637bc85516146100cf5780638e2b0950146100e25780639a93008c14610107575b600080fd5b61007a6100753660046104c5565b61011a565b005b60005461008f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100bf6100ba3660046104c5565b610184565b60405190151581526020016100a3565b60015461008f906001600160a01b031681565b6100f56100f036600461059f565b6101ca565b60405160ff90911681526020016100a3565b6100f5610115366004610627565b61043c565b61012333610184565b61016257604051636381e58960e11b815260206004820152600b60248201526a4f6e6c79206f776e65722160a81b604482015260640160405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b03821630141561019f57506001919050565b6000546001600160a01b03838116911614156101bd57506001919050565b506000919050565b919050565b6001546040516323bdace160e01b815260009182916001600160a01b03909116906323bdace1906101ff908790600401610698565b602060405180830381865afa15801561021c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061024091906106e5565b6001546040516323bdace160e01b81529192506000916001600160a01b03909116906323bdace190610276908790600401610698565b602060405180830381865afa158015610293573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102b791906106e5565b6102c19083610718565b90506000600160009054906101000a90046001600160a01b03166001600160a01b03166337df99626040518163ffffffff1660e01b8152600401602060405180830381865afa158015610318573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033c91906106e5565b9050610432838383600160009054906101000a90046001600160a01b03166001600160a01b0316630e878ed06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103bb9190610740565b600160009054906101000a90046001600160a01b03166001600160a01b03166307f449996040518163ffffffff1660e01b8152600401602060405180830381865afa15801561040e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101159190610740565b9695505050505050565b600061044b60ff84168561075d565b63ffffffff1661045c86606461075d565b63ffffffff161015610470575060016104a5565b61047d8560ff841661075d565b63ffffffff1661048e87606461075d565b63ffffffff16106104a1575060026104a5565b5060035b95945050505050565b80356001600160a01b03811681146101c557600080fd5b6000602082840312156104d757600080fd5b6104e0826104ae565b9392505050565b63b95aa35560e01b600052604160045260246000fd5b600082601f83011261050e57600080fd5b8135602067ffffffffffffffff8083111561052b5761052b6104e7565b8260051b604051601f19603f83011681018181108482111715610550576105506104e7565b60405293845285810183019383810192508785111561056e57600080fd5b83870191505b8482101561059457610585826104ae565b83529183019190830190610574565b979650505050505050565b600080604083850312156105b257600080fd5b823567ffffffffffffffff808211156105ca57600080fd5b6105d6868387016104fd565b935060208501359150808211156105ec57600080fd5b506105f9858286016104fd565b9150509250929050565b63ffffffff8116811461061557600080fd5b50565b60ff8116811461061557600080fd5b600080600080600060a0868803121561063f57600080fd5b853561064a81610603565b9450602086013561065a81610603565b9350604086013561066a81610603565b9250606086013561067a81610618565b9150608086013561068a81610618565b809150509295509295909350565b6020808252825182820181905260009190848201906040850190845b818110156106d95783516001600160a01b0316835292840192918401916001016106b4565b50909695505050505050565b6000602082840312156106f757600080fd5b81516104e081610603565b63b95aa35560e01b600052601160045260246000fd5b600063ffffffff80831681851680830382111561073757610737610702565b01949350505050565b60006020828403121561075257600080fd5b81516104e081610618565b600063ffffffff8083168185168183048111821515161561078057610780610702565b0294935050505056fea2646970667358221220fabea83a81929920d3c210ab7da2ccedb38f40dcd6c8c80fc0e4c020d8ff182164736f6c634300080b0033";
// clang-format on

class AuthInitializer
{
public:
    static void init(protocol::BlockNumber _number,
        const std::shared_ptr<ProtocolInitializer>& _protocol,
        const std::shared_ptr<NodeConfig>& _nodeConfig,
        const bcos::scheduler::SchedulerInterface::Ptr& _scheduler)
    {
        auto block = _protocol->blockFactory()->createBlock();
        block->blockHeader()->setNumber(_number);

        // hex bin code to bytes
        bytes code;
        boost::algorithm::unhex(
            _nodeConfig->smCryptoType() ? committeeSmBin : committeeBin, std::back_inserter(code));

        // constructor (address[] initGovernors,    = [authAdminAddress]
        //        uint32[] memory weights,          = [1]
        //        uint8 participatesRate,           = 0
        //        uint8 winRate)                    = 0
        auto authAdmin = Address(_nodeConfig->authAdminAddress());
        std::vector<Address> initGovernors({authAdmin});
        std::vector<string32> weights({bcos::codec::toString32(h256(1))});
        INITIALIZER_LOG(DEBUG) << LOG_BADGE("AuthInitializer")
                               << LOG_KV("authAdminAddress", _nodeConfig->authAdminAddress());

        // bytes code + abi encode constructor params
        codec::abi::ContractABICodec abi(_protocol->cryptoSuite()->hashImpl());
        bytes input = code + abi.abiIn("", initGovernors, weights, codec::toString32(h256(0)),
                                 codec::toString32(h256(0)));

        auto tx = _protocol->blockFactory()->transactionFactory()->createTransaction(3,
            precompiled::AUTH_COMMITTEE_ADDRESS, input, u256(_number), 500, _nodeConfig->chainId(),
            _nodeConfig->groupId(), utcTime());
        tx->forceSender(authAdmin.asBytes());
        block->appendTransaction(tx);

        std::promise<bcos::protocol::BlockHeader::Ptr> executedHeader;
        _scheduler->executeBlock(block, false,
            [&](bcos::Error::Ptr&& _error, bcos::protocol::BlockHeader::Ptr&& _header, bool) {
                if (_error)
                {
                    INITIALIZER_LOG(ERROR) << LOG_BADGE("AuthInitializer")
                                           << LOG_KV("errorMsg", _error->errorMessage());
                    BOOST_THROW_EXCEPTION(
                        BCOS_ERROR(-1, "AuthInitializer: scheduler executeBlock error"));
                }
                INITIALIZER_LOG(DEBUG)
                    << LOG_BADGE("AuthInitializer") << LOG_DESC("scheduler execute block success!")
                    << LOG_KV("blockHash", block->blockHeader()->hash().hex());
                executedHeader.set_value(std::move(_header));
            });
        auto header = executedHeader.get_future().get();

        std::promise<std::tuple<Error::Ptr, bcos::ledger::LedgerConfig::Ptr>> committedConfig;
        _scheduler->commitBlock(
            header, [&](Error::Ptr&& _error, bcos::ledger::LedgerConfig::Ptr&& _config) {
                if (_error)
                {
                    INITIALIZER_LOG(ERROR) << LOG_BADGE("AuthInitializer")
                                           << LOG_KV("errorMsg", _error->errorMessage());
                    committedConfig.set_value(std::make_tuple(std::move(_error), nullptr));
                    return;
                }
                committedConfig.set_value(std::make_tuple(nullptr, std::move(_config)));
            });
        auto [error, newConfig] = committedConfig.get_future().get();
        if (error != nullptr && newConfig->blockNumber() != _number)
        {
            INITIALIZER_LOG(ERROR)
                << LOG_BADGE("AuthInitializer") << LOG_DESC("Error in commitBlock")
                << (error ? "errorMsg" + error->errorMessage() : "")
                << LOG_KV("configNumber", newConfig->blockNumber());
            BOOST_THROW_EXCEPTION(BCOS_ERROR(-1, "AuthInitializer commitBlock error"));
        }
    }
};
}  // namespace bcos::initializer